package com.future;

/**
 * Description:
 * 给定一个单词，你需要判断单词的大写使用是否正确。
 * <p>
 * 我们定义，在以下情况时，单词的大写用法是正确的：
 * <p>
 * 1、全部字母都是大写，比如"USA"。
 * 2、单词中所有字母都不是大写，比如"leetcode"。
 * 3、如果单词不只含有一个字母，只有首字母大写，比如"Google"。
 * 否则，我们定义这个单词没有正确使用大写字母。
 * <p>
 * 示例 1:
 * <p>
 * 输入: "USA"
 * 输出: True
 * 示例 2:
 * <p>
 * 输入: "FlaG"
 * 输出: False
 * 注意: 输入是由大写和小写拉丁字母组成的非空单词。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/detect-capital
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author weiruibai.vendor
 * Date: 2021/9/29 10:34
 */
public class Solution_520 {

    public static void main(String[] args) {

        System.out.println(detectCapitalUse("USA"));
        System.out.println(detectCapitalUse("FlaG"));
        System.out.println(detectCapitalUse("leetCode"));
    }

    public static boolean detectCapitalUse(String word) {
        if (word == null || "".equals(word)) {
            return false;
        }
        char[] chars = word.toCharArray();
        // 表示第一个字母是否是大写
        boolean firstCharIsCapital = ((int) chars[0] >= (int) 'A') && ((int) chars[0] <= (int) 'Z');
        boolean secondIsCapital = false; // 记录第二个字符是否是大写
        for (int i = 1; i < chars.length; i++) {
            int cha = chars[i];
            boolean curIsCapital = ((cha >= (int) 'A') && cha <= (int) 'Z');
            if (firstCharIsCapital) {
                // 首字母大写，后面的字母要么大写，要么都小写
                if (i == 1 && curIsCapital) {
                    // 第二个字符是大写
                    secondIsCapital = true;
                }
                /**
                 * 接下来，保证secondIsCapital与curIsCapital
                 * 一致就说明是符合，否则直接返回false
                 */
                if (secondIsCapital != curIsCapital) {
                    return false;
                }
            } else {
                // 所有字符都是小写
                if (curIsCapital) {
                    // 出现大写，直接返回false
                    return false;
                }
            }
        }
        return true;
    }
}
